#define privify_memory(x,y) do {} while(0)
#endif
-static void __init loaddomainelfimage(struct domain *d, struct elf_binary *elf)
+static void __init loaddomainelfimage(struct domain *d, struct elf_binary *elf,
+ unsigned long phys_load_offset)
{
const elf_phdr *phdr;
int phnum, h, filesz, memsz;
memsz = elf_uval(elf, phdr, p_memsz);
elfaddr = (unsigned long) elf->image + elf_uval(elf, phdr, p_offset);
dom_mpaddr = elf_uval(elf, phdr, p_paddr);
+ dom_mpaddr += phys_load_offset;
while (memsz > 0) {
p = assign_new_domain_page(d,dom_mpaddr);
unsigned long pkern_end;
unsigned long pinitrd_start = 0;
unsigned long pstart_info;
+ unsigned long phys_load_offset;
struct page_info *start_info_page;
unsigned long bp_mpa;
struct ia64_boot_param *bp;
if (0 != (elf_xen_parse(&elf, &parms)))
return rc;
+ /*
+ * We cannot rely on the load address in the ELF headers to
+ * determine the meta physical address at which the image
+ * is loaded. Patch the address to match the real one, based
+ * on xen_pstart
+ */
+ phys_load_offset = xen_pstart - elf.pstart;
+ elf.pstart += phys_load_offset;
+ elf.pend += phys_load_offset;
+ parms.virt_kstart += phys_load_offset;
+ parms.virt_kend += phys_load_offset;
+ parms.virt_entry += phys_load_offset;
+
printk(" Dom0 kernel: %s, %s, paddr 0x%" PRIx64 " -> 0x%" PRIx64 "\n",
elf_64bit(&elf) ? "64-bit" : "32-bit",
elf_msb(&elf) ? "msb" : "lsb",
/* The next page aligned boundary after the start info.
Note: EFI_PAGE_SHIFT = 12 <= PAGE_SHIFT */
pinitrd_start = pstart_info + PAGE_SIZE;
- if (pinitrd_start + initrd_len >= dom0_size)
+
+ if ((pinitrd_start + initrd_len - phys_load_offset) >= dom0_size)
panic("%s: not enough memory assigned to dom0", __func__);
+
for (offset = 0; offset < initrd_len; offset += PAGE_SIZE) {
struct page_info *p;
p = assign_new_domain_page(d, pinitrd_start + offset);
panic("Cannot allocate dom0 vcpu %d\n", i);
/* Copy the OS image. */
- loaddomainelfimage(d,&elf);
+ loaddomainelfimage(d, &elf, phys_load_offset);
BUILD_BUG_ON(sizeof(start_info_t) + sizeof(dom0_vga_console_info_t) +
sizeof(struct ia64_boot_param) > PAGE_SIZE);